#!/usr/bin/env wish
package require Tclx

proc conectar args {
    global sock
    
    .widget_entry delete 0 end
    
    if {[llength $args] < 1} {
        echo "-\nInsuficientes parámetros para el comando \"conectar\".\n"
        echo "Ejemplo de uso: \"/conectar 10.0.0.1\".\n-\n"
    } else {
        if {$sock != ""} {
            echo "-\nconectar: Debe desconectarse previamente.\n-\n"
        } else {
            set ip [lindex $args 0]
            
            catch {set sock [socket $ip 2345]}
            if {$sock != ""} {
                fileevent $sock readable evento_socket_legible
                fconfigure $sock -buffering line -blocking 0
                wm title . "lanchat2 - $ip"
                echo "-\nConexión con $ip.\n-\n"
            } else {
                echo "-\nconectar: No se pudo establecer conexión con $ip.\n-\n"
            }
        }
    }
}

proc desconectar args {
    global sock
    
    if {$sock != ""} {
        close $sock
        set sock ""
        wm title . "lanchat2"
        echo "-\nConexión finalizada.\n-\n"
    }
}

proc echo {texto} {
    .widget_text configure -state normal
    .widget_text insert end $texto tag1
    .widget_text configure -state disabled
    .widget_text see end
}

proc evento_socket_legible { } {
    global sock
    
    if {[gets $sock texto_recibido] >= 0} {
        echo "remoto> $texto_recibido\n"
    } elseif {[eof $sock]} {
        desconectar
    }
}

proc evento_tecla_return { } {
    global sock
    
    set texto [.widget_entry get]
    
    # si no es un comando...
    if {[string index $texto 0] != "/"} {
        set mensaje $texto
        if {$sock != ""} {
            .widget_entry delete 0 end
            puts $sock $mensaje
            echo "local > $mensaje\n"
        }
    # si es un comando...
    } else {
        set comando [string range $texto 1 end]
        .widget_entry delete 0 end
        switch [lindex $comando 0] {
            conectar        -
            desconectar     -
            salir           {eval $comando}
            default         {echo "-\nComando no reconocido.\n-\n"}
        }
    }
}

proc salir args {
    exit 0
}

#
# se configura el socket
#

    if {$argc == 0} {
        set sock ""
    } else {
        set sock [dup [lindex $argv 0]]
        fileevent $sock readable evento_socket_legible
        fconfigure $sock -buffering line -blocking 0
    }

#
# se crea la ventana
#

    text .widget_text -state disabled -background white -wrap word -yscrollcommand ".widget_scrollbar set"
    .widget_text tag configure tag1 -lmargin2 16
    
    scrollbar .widget_scrollbar -command ".widget_text yview"
    
    entry .widget_entry -background white
    bind .widget_entry <KeyRelease-Return> evento_tecla_return
    focus .widget_entry
    
    pack .widget_entry -side bottom -fill x
    pack .widget_scrollbar -side right -fill y
    pack .widget_text -fill both -expand yes
    
    if {$sock == ""} {
        wm title . "lanchat2"
    } else {
        set ip [lindex [fconfigure $sock -peername] 0]
        wm title . "lanchat2 - $ip"
        echo "-\nConexión con $ip.\n-\n"
    }

